/*
 * DTDComplexRule.h
 * Cette classe permet de représenter les règles associées à un <!ELEMENT dans une DTD qui commencent par un "(".
 * Elle encapsule ensuite la liste des règles à appliquer sur l'élèment
 *
 *  Created on: 29 mars 2011
 *      Author: gdoussin
 */

#ifndef DTDCOMPLEXRULE_H_
#define DTDCOMPLEXRULE_H_

#include <vector>
#include <string>
#include "DTDSimpleRule.h"
#include "DTDRule.h"
#include "../commun.h"

class DTDComplexRule : public DTDRule
{
	protected :
		/**
		 * Liste des règles qui s'appliquent sur la complexRule
		 */
		std::vector<DTDRule *> rules;

		/**
		 * La jointure (un pipe ou un comma)
		 */
		type joinType;
	public:
		/**
		 * Crée une ComplexRule avec le séparateur indiqué
		 * La cardinalité peut-être ensuite définie via la méthode setCardinality
		 */
		DTDComplexRule(type joinType);

		/**
		 * Ajoute une Rule à la fin dans la liste gérée par la ComplexRule
		 */
		void addRule(DTDRule * rule);

		/**
		 * Ajoute une Rule au début dans la liste gérée par la ComplexRule
		 */
		void addRuleFront(DTDRule * rule);

		/**
		 * Définit la liste des règles associées au ComplexRule
		 */
		void setRules(std::vector<DTDRule *>);

		/**
		 * Exporte la règle sous forme de string
		 */
		std::string toString();

		/**
		 * Teste la validité des balises passées en paramètre
		 */
		bool isValid(std::vector< std::string > balises);

		/**
		 * Cherche une règle correspondant à ruleName dans les 'rules'.
		 * Renvoie NULL si rien n'est trouvé.
		 */
		DTDSimpleRule* FindRule(std::string ruleName);

		/**
		 * Renvoi l'itérateur de la règle simple correspondant à ruleName
		 * Si l'itérateur renvoyé est l'itérateur de fin, la règle n'a pas été
		 * trouvée
		 */
		std::vector< DTDRule* >::iterator findSimpleRule(std::string ruleName);

		/**
		 * Renvoi l'itérateur de la règle complexe contenant la règle simple
		 * correspondant à ruleName
		 * Si l'itérateur renvoyé est l'itérateur de fin, la règle n'a pas été
		 * trouvée
		 */
		std::vector< DTDRule* >::iterator findComplexRule(std::string ruleName);

		/**
		 * Ajoute dans enablesBalises les prochaines balises qui peuvent être rencontrées.
		 */
		void findEnabledBalises(std::vector< std::string > & enabledBalises);

		/**
		 * Ajoute dans enablesBalises les prochaines balises qui peuvent être rencontrées après 'balise'.
		 */
		void findEnabledBalises(std::vector< std::string > & enabledBalises, std::string balise);


};

#endif /* DTDCOMPLEXRULE_H_ */
